import BigNumber from "bignumber.js"

// 开启后，如果传入的值格式不正确，控制台会报错，不开启，返回对象是null
BigNumber.DEBUG = true

// 默认全局配置
// BigNumber.config({
//     EXPONENTIAL_AT: [-7, 20],
//     DECIMAL_PLACES: 4,
//     ROUNDING_MODE: BigNumber.ROUND_HALF_UP
// })
 

export const ROUND_MODE = {
    ROUND_UP: 0, //向上舍入。如果小数部分大于等于 0.5，则向上舍入；否则，向下舍入。
    ROUND_DOWN: 1, //向下舍入。无论小数部分的值如何，都直接向下舍入。
    ROUND_CEIL: 2, //向正无穷方向舍入。如果是正数，则向上舍入；如果是负数，则向下舍入。
    ROUND_FLOOR: 3, //向负无穷方向舍入。如果是正数，则向下舍入；如果是负数，则向上舍入。
    ROUND_HALF_UP: 4, //四舍五入。如果小数部分大于等于 0.5，则向上舍入；否则，向下舍入。
    ROUND_HALF_DOWN: 5, //五舍六入。如果小数部分大于 0.5，则向上舍入；否则，向下舍入。
    ROUND_HALF_EVEN: 6, //银行家舍入法。如果小数部分恰好等于 0.5，则根据前一位的奇偶性决定舍入方向。
    ROUND_HALF_CEIL: 7, //向最接近的整数方向舍入，同时遵循 BigNumber.ROUND_CEIL 的规则。
    ROUND_HALF_FLOOR: 8 //向最接近的整数方向舍入，同时遵循 BigNumber.ROUND_FLOOR 的规则。
}

//第一个参数是字符串，第二个参数是要转成什么进制
export function getBigNumber(value, n) {
    if (n === undefined || n === null || n == '') {
        return new BigNumber(value)
    }
    return new BigNumber(value, n)
}

// 初始化配置
export function initBigNumber(config) {
    BigNumber.config(config)
}

/**
 * 加法
 * @param {*} v1 操作数1
 * @param {*} v2 操作数2
 * @param {*} config 自定义配置
 * @returns Number
 */
export function plus(v1, v2, config) {
    if (config) {
        return plusScope(v1, v2, config)
    }
    return new BigNumber(v1).plus(v2).toNumber()
}

/**
 * 减法
 * @param {*} v1 操作数1
 * @param {*} v2 操作数2
 * @param {*} config 自定义配置
 * @returns Number
 */
export function minus(v1, v2, config) {
    if (config) {
        return minusScope(v1, v2, config)
    }
    return new BigNumber(v1).minus(v2).toNumber()
}

/**
 * 乘法
 * @param {*} v1 操作数1
 * @param {*} v2 操作数2
 * @param {*} config 自定义配置
 * @returns Number
 */
export function multiply(v1, v2, config) {
    if (config) {
        return multiplyScope(v1, v2, config)
    }
    return new BigNumber(v1).multipliedBy(v2).toNumber()
}

/**
 * 除法
 * @param {*} v1 操作数1
 * @param {*} v2 操作数2
 * @param {*} config 自定义配置
 * @returns Number
 */
export function divided(v1, v2, config) {
    if (config) {
        return divideScope(v1, v2, config)
    }
    return new BigNumber(v1).dividedBy(v2).toNumber()
}

// 自定义加法
function plusScope(v1, v2, config) {
    let BN = BigNumber.clone(config)
    return BN(v1).plus(v2).toNumber()
}

// 自定义减法
function minusScope(v1, v2, config) {
    let BN = BigNumber.clone(config)
    return BN(v1).minus(v2).toNumber()
}

// 自定义乘法
function multiplyScope(v1, v2, config) {
    let BN = BigNumber.clone(config)
    return BN(v1).multipliedBy(v2).toNumber()
}

// 自定义除法
function divideScope(v1, v2, config) {
    let BN = BigNumber.clone(config)
    return BN(v1).dividedBy(v2).toNumber()
}

export default {
    ROUND_MODE,
    getBigNumber,
    plus,
    minus,
    multiply,
    divided,
    initBigNumber
}